/* Copyright (c) 2004-2024 Peigen.info. All rights reserved. */

package info.peigen.hotpot.component.gateway.core;

import info.peigen.hotpot.common.service.base.gateway.AbstractGatewayRequest;
import info.peigen.hotpot.component.gateway.core.http.info.DatagramInfo;
import info.peigen.hotpot.component.gateway.core.sign.info.SignInfo;

/**
 * <b>(HandleCommonPost)</b>
 *
 * @author Peigen
 * @version 1.0.0
 * @since 2021/4/17
 */
public interface HandleCommonPost<REQUEST extends AbstractGatewayRequest, RESPONSE> {

    /**
     * 初始化请求
     *
     * @return 请求对象
     *
     * @throws Exception 可能的异常
     */
    REQUEST installRequest() throws Exception;

    /**
     * 签名处理
     *
     * @param request 请求对象
     *
     * @return SignInfo
     */
    default SignInfo getSignInfo(REQUEST request) {
        return null;
    }

    /**
     * 返回数据处理
     *
     * @param request   请求对象
     * @param signature 前面后的字符串
     *
     * @return DatagramInfo
     *
     * @throws Exception 可能的异常
     */
    DatagramInfo getDatagramInfo(REQUEST request, String signature) throws Exception;

    /**
     * 初始化响应
     *
     * @param respMsg 返回原始字符串
     * @param request 请求
     *
     * @return 响应对象
     *
     * @throws Exception 加解密的时候会抛出异常，在handleException()处理
     */
    RESPONSE installResponse(String respMsg, REQUEST request) throws Exception;

    /**
     * 组织返回对象
     *
     * @param response 响应对象
     */
    void handleResponse(RESPONSE response);

    /**
     * 根据不同的情况下，对于异常的处理<br/>
     *
     * @param e 异常
     */
    default void handleException(Exception e) {
        // 异常处理不规范的时候，打印堆栈，后续优化
        e.printStackTrace();
    }

    /** 超时异常处理 */
    void handleTimeOutException();
}